home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / hips / sources / lut / scaletbl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-04  |  6.7 KB  |  276 lines

  1. /* scaletbl.c - Scales a HIPS table from short, int, or float to byte
  2.  *        for use in the XV Map Apply window.
  3.  *
  4.  * usage: scaletbl [-l lower_bound] [-u upper_bound] [-fill value]
  5.         < source_tablename
  6.         > destination_tablename
  7.  *
  8.  * lower_bound and upper_bound mark off the respective boundaries over the
  9.  * range 0..255 to which the scaling functions are applied.  Gray values
  10.  * outside this range may be mapped to a value or left unchanged, according
  11.  * to the fill flag.
  12.  *
  13.  * written by Bryan Skene (skene@george.lbl.gov)
  14.  *        February 20, 1991
  15.  *
  16.  *  to load: cc -o scaletbl scaletbl.c -lhips -lm
  17.  */
  18.  
  19. #include <stdio.h>
  20.  
  21. #include <hipl_format.h>
  22. #include <math.h>
  23.  
  24. #if _STDC_
  25. void      usage(void);
  26. void      DoScaling_byte(void);
  27. void      DoScaling_short(void);
  28. void      DoScaling_int(void);
  29. void      DoScaling_float(void);
  30. #else
  31. void      usage();
  32. void      DoScaling_byte();
  33. void      DoScaling_short();
  34. void      DoScaling_int();
  35. void      DoScaling_float();
  36. #endif
  37.  
  38. #define MAXBYTE  256
  39.  
  40. unsigned char lower_bound = 0, upper_bound = 255;
  41. int       numentries, form, fill = 0, fill_value;
  42.  
  43. unsigned char *blut;
  44. short    *slut;
  45. int      *ilut;
  46. float    *flut;
  47.  
  48. main(argc, argv)
  49.     int       argc;
  50.     char    **argv;
  51. {
  52.  
  53.     int       i = 0, entry;
  54.  
  55.     Progname = strsave(*argv);
  56.     fprintf(stderr, "argc = %d\n", argc);
  57.  
  58.     if (argc > 1 && argv[1][0] == '-') {
  59.     fprintf(stderr, "We're on the first arg ...\n");
  60.     if (argv[1][1] == 'l') {
  61.         lower_bound = (unsigned char) atoi(argv[2]);
  62.     } else if (argv[1][1] == 'u') {
  63.         upper_bound = (unsigned char) atoi(argv[2]);
  64.     } else if (argv[1][1] == 'f') {
  65.         fill = 1;
  66.         fill_value = (unsigned char) atoi(argv[2]);
  67.     } else
  68.         usage();
  69.     if (argc > 3 && argv[3][0] == '-') {
  70.         fprintf(stderr, "We're on the second arg ...\n");
  71.         if (argv[3][1] == 'l') {
  72.         lower_bound = (unsigned char) atoi(argv[4]);
  73.         } else if (argv[3][1] == 'u') {
  74.         upper_bound = (unsigned char) atoi(argv[4]);
  75.         } else if (argv[3][1] == 'f') {
  76.         fill = 1;
  77.         fill_value = (unsigned char) atoi(argv[4]);
  78.         } else
  79.         usage();
  80.         if (argc > 5 && argv[5][0] == '-') {
  81.         fprintf(stderr, "We're on the third arg ...\n");
  82.         if (argv[5][1] == 'l') {
  83.             lower_bound = (unsigned char) atoi(argv[6]);
  84.         } else if (argv[5][1] == 'u') {
  85.             upper_bound = (unsigned char) atoi(argv[6]);
  86.         } else if (argv[5][1] == 'f') {
  87.             fill = 1;
  88.             fill_value = (unsigned char) atoi(argv[6]);
  89.         } else
  90.             usage();
  91.         }
  92.     }
  93.     }
  94.     fprintf(stderr, "parsed the args ...\n");
  95.     fscanf(stdin, "%d%d", &numentries, &form);
  96.     fprintf(stderr, "Form: %d\tNumber of Entries: %d\n", form, numentries);
  97.     fprintf(stdout, "%d\n%d\n", numentries, PFBYTE);
  98.  
  99.     switch (form) {
  100.     case PFBYTE:
  101.     blut = (unsigned char *) halloc(numentries,
  102.                     sizeof(unsigned char));
  103.     for (i = 0; i < numentries; i++) {
  104.         fscanf(stdin, "%d", &entry);
  105.         blut[i] = (unsigned char) entry;
  106.     }
  107.     DoScaling_byte();
  108.     break;
  109.     case PFSHORT:
  110.     slut = (short *) halloc(numentries, sizeof(int));
  111.     for (i = 0; i < numentries; i++) {
  112.         fscanf(stdin, "%d", &entry);
  113.         slut[i] = (short) entry;
  114.     }
  115.     DoScaling_short();
  116.     break;
  117.     case PFINT:
  118.     ilut = (int *) halloc(numentries, sizeof(int));
  119.     for (i = 0; i < numentries; i++)
  120.         fscanf(stdin, "%d", &ilut[i]);
  121.     DoScaling_int();
  122.     break;
  123.     case PFFLOAT:
  124.     flut = (float *) halloc(numentries, sizeof(float));
  125.     for (i = 0; i < numentries; i++)
  126.         fscanf(stdin, "%f", &flut[i]);
  127.     DoScaling_float();
  128.     break;
  129.     default:
  130.     perr(HE_MSG, "table is of unkown format");
  131.     }
  132.     exit(0);
  133. }
  134.  
  135. void 
  136. DoScaling_byte()
  137. {
  138.  
  139. /* search table, find min and max, build a new blut based on min and max */
  140.     unsigned char min, max, scaled_val, delta, offset;
  141.     int       i;
  142.  
  143.     offset = 0;
  144.     min = max = blut[1];
  145.     for (i = 0; i < numentries; i++) {
  146.     if (blut[i] < min)
  147.         min = blut[i];
  148.     if (blut[i] > max)
  149.         max = blut[i];
  150.     }
  151.     if (min < 0)
  152.     offset = (-min);
  153.     delta = max - min;
  154.     fprintf(stderr, "min = %d, max = %d, delta = %d\n", min, max, delta);
  155.  
  156.     for (i = 0; i < MAXBYTE; i++) {
  157.     if (i >= lower_bound && i <= upper_bound)
  158.         scaled_val = (unsigned char) ((float) (blut[i] + offset)
  159.                       / (float) delta * (float) MAXBYTE);
  160.     else if (fill)
  161.         scaled_val = fill_value;
  162.     else
  163.         scaled_val = i;
  164.     printf("%d\n", scaled_val);
  165.     }
  166. }
  167.  
  168. void 
  169. DoScaling_short()
  170. {
  171.  
  172. /* search table, find min and max, build a new blut based on min and max */
  173.     short     min, max, delta, offset;
  174.     unsigned char scaled_val;
  175.     int       i;
  176.  
  177.     offset = 0;
  178.     min = max = slut[1];
  179.     for (i = 0; i < numentries; i++) {
  180.     if (slut[i] < min)
  181.         min = slut[i];
  182.     if (slut[i] > max)
  183.         max = slut[i];
  184.     }
  185.     if (min < 0)
  186.     offset = -min;
  187.     delta = max - min;
  188.     fprintf(stderr, "min = %d, max = %d, delta = %d\n", min, max, delta);
  189.  
  190.     for (i = 0; i < MAXBYTE; i++) {
  191.     if (i >= lower_bound && i <= upper_bound)
  192.         scaled_val = (unsigned char) ((float) (slut[i] + offset)
  193.                       / (float) delta * (float) MAXBYTE);
  194.     else if (fill)
  195.         scaled_val = fill_value;
  196.     else
  197.         scaled_val = i;
  198.     fprintf(stdout, "%d\n", scaled_val);
  199.     }
  200. }
  201.  
  202. void 
  203. DoScaling_int()
  204. {
  205.  
  206. /* search table, find min and max, build a new blut based on min and max */
  207.     int       min, max, delta, offset;
  208.     unsigned char scaled_val;
  209.     int       i;
  210.  
  211.     offset = 0;
  212.     min = max = ilut[1];
  213.     for (i = 0; i < numentries; i++) {
  214.     if (ilut[i] < min)
  215.         min = ilut[i];
  216.     if (ilut[i] > max)
  217.         max = ilut[i];
  218.     }
  219.     if (min < 0)
  220.     offset = -min;
  221.     delta = max - min;
  222.     fprintf(stderr, "min = %d, max = %d, delta = %d\n", min, max, delta);
  223.  
  224.     for (i = 0; i < MAXBYTE; i++) {
  225.     if (i >= lower_bound && i <= upper_bound)
  226.         scaled_val = (unsigned char) ((float) (ilut[i] + offset)
  227.                       / (float) delta * (float) MAXBYTE);
  228.     else if (fill)
  229.         scaled_val = fill_value;
  230.     else
  231.         scaled_val = i;
  232.     fprintf(stdout, "%d\n", scaled_val);
  233.     }
  234. }
  235.  
  236. void 
  237. DoScaling_float()
  238. {
  239.  
  240. /* search table, find min and max, build a new blut based on min and max */
  241.     float     min, max, delta, offset;
  242.     unsigned char scaled_val;
  243.     int       i;
  244.  
  245.     offset = 0.0;
  246.     min = max = flut[1];
  247.     for (i = 0; i < numentries; i++) {
  248.     if (flut[i] < min)
  249.         min = flut[i];
  250.     if (flut[i] > max)
  251.         max = flut[i];
  252.     }
  253.     if (min < 0.0)
  254.     offset = -min;
  255.     delta = max - min;
  256.     fprintf(stderr, "min = %f, max = %f, delta = %f\n", min, max, delta);
  257.  
  258.     for (i = 0; i < MAXBYTE; i++) {
  259.     if (i >= lower_bound && i <= upper_bound)
  260.         scaled_val = (unsigned char) ((float) (flut[i] + offset)
  261.                       / (float) delta * (float) MAXBYTE);
  262.     else if (fill)
  263.         scaled_val = fill_value;
  264.     else
  265.         scaled_val = i;
  266.     fprintf(stdout, "%d\n", scaled_val);
  267.     }
  268. }
  269.  
  270. void 
  271. usage()
  272. {
  273.     fprintf(stderr, "usage: scaletbl [-l lower_bound] [-u upper_bound] < source_table > dest_table\n");
  274.     exit(-1);
  275. }
  276.